package com.example.concurrent.chapter14;

/**
 * @author Liuqz
 * @date 2018/11/25 20:45
 *
 * Holder单例模式
 *
 * 在HolderSingleton类中并没有instance静态成员,而是将其放在静态内部类Holder之中,因此在Singleton类的初始化过程中并不会创建Signleton的实例,
 * Holder类中定义了Singleton的静态变量,并且直接实例化,当Holder被主动引用的时候则会创建HolderSingleton的实例
 * HolderSingleton实例的创建过程在Java程序编译时期收集至<clinit>()方法中,该方法又是同步方法,
 * 同步方法可以保证内存的可见性,JVM指令的顺序性和原子性,Holder方法的单例设计是最好的设计之一,也是目前使用比较广的设计之一
 *
 */

//final不允许被继承
public final class HolderSingleton {

    /*private byte[] data = new byte[1024];

    private HolderSingleton() {

    }

    //在静态内部类中持有HolderSingleton的实例,并且可被直接初始化
    private static class Holder{
        private static HolderSingleton instance = new HolderSingleton();
    }

    //调用getInstance方法,事实上是获得Holder的instance静态属性
    public static HolderSingleton getInstance() {
        return Holder.instance;
    }*/


    private byte[] data = new byte[1024];

    private HolderSingleton() {

    }

    private static class Holder{
        private static HolderSingleton instance = new HolderSingleton();
    }

    public static HolderSingleton getInstance() {
        return Holder.instance;
    }
}
